package com.bestcem.xm.label.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.common.core.uitls.DateUtil;
import com.bestcem.xm.label.dao.LabelValueDao;
import com.bestcem.xm.label.entity.pojo.LabelValueDO;
import com.bestcem.xm.label.grpc.service.param.label.*;
import com.bestcem.xm.label.service.LabelValueService;
import com.bestcem.xm.label.service.dto.label.LabelValueDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 标签值服务
 *
 * @author yf.wang <yf.wang@idiaoyan.com>
 * @version V1.0
 * @date 2021/5/21
 */

@Slf4j
@Service
public class LabelValueServiceImpl implements LabelValueService {

    @Resource
    private LabelValueDao labelValueDao;

    @Override
    public ServiceResult<Boolean> checkLabelValueName(CheckLabelValueNameParam param) {
        List<LabelValueDO> value =
                labelValueDao.listByLabelIdAndValue(param.getLabelId(), param.getValue());
        Boolean repeat = CollectionUtil.isNotEmpty(value);
        return ServiceResult.success(repeat);
    }

    @Override
    public ServiceResult<Boolean> batchUpdateLabelValues(BatchUpdateLabelValuesParm param) {
        List<BatchUpdateLabelValueParm> values = param.getValues();
        // 循环进行更新
        Date updateTime = DateUtil.getCommonDate();
        for (int i = 0; i < values.size(); i++) {
            BatchUpdateLabelValueParm batchUpdateLabelValueParm = values.get(i);
            Boolean updateResult = labelValueDao.updateSerialByParam(batchUpdateLabelValueParm.getSerial(), batchUpdateLabelValueParm.getId(), updateTime);
            if (!updateResult) {
                log.error("标签值 {} 序号 {} 更新失败", batchUpdateLabelValueParm.getId(), batchUpdateLabelValueParm.getSerial());
            }
        }
        return ServiceResult.success(Boolean.TRUE);
    }

    @Override
    public void save(List<CreateLabelValueParam> tagValueParam, LabelParamBase labelParam, String labelId, String labelGroupName) {
        List<LabelValueDO> labelValues = buildLabelValue(tagValueParam, labelParam, labelId, labelGroupName);
        // 批量保存标签值
        labelValueDao.saveBatch(labelValues);
    }

    /**
     * 构建标签值数据
     *
     * @param tagValueParam
     * @param labelParam
     * @param labelId
     * @param labelGroupName
     * @return
     */
    private List<LabelValueDO> buildLabelValue(List<CreateLabelValueParam> tagValueParam, LabelParamBase labelParam, String labelId, String labelGroupName) {
        List<LabelValueDO> labelValues = new ArrayList<>();
        tagValueParam.forEach(tagValue -> {
            LabelValueDO value = new LabelValueDO();
            // 联系人类型
            value.setMemberType(labelParam.getAttribute());

            // 是否手动打标签
            if (Objects.nonNull(labelParam.getManual())) {
                value.setManual(labelParam.getManual() ? 1 : 0);
            }
            // 是否自动打标签
            if (Objects.nonNull(labelParam.getAuto())) {
                value.setAuto(labelParam.getAuto() ? 1 : 0);
            }

            // 组织id
            value.setOrgId(labelParam.getOrgId());
            // 标签值名称
            value.setValue(tagValue.getValue());
            // 标签值序号
            value.setSeq(tagValue.getSerial());
            // 标签id
            value.setLabelId(labelId);
            // 标签名称
            value.setLabelName(labelParam.getName());
            // 标签组id
            value.setLabelGroupId(labelParam.getLabelGroupId());
            // 标签组名称
            value.setLabelGroupName(labelGroupName);
            // 标签条件
            value.setCondition(tagValue.getCondition());
            // 创建时间
            value.setCreateTime(DateUtil.getCommonDate());
            // 更新时间
            value.setUpdateTime(value.getCreateTime());
            labelValues.add(value);
        });

        return labelValues;
    }

    @Override
    public List<LabelValueDO> findById(List<String> labels) {
        List<String> ids = new ArrayList<>();
        labels.forEach(id -> {
            // 筛选 为了避免因为数据问题导致的BUG
            if (StrUtil.isNotEmpty(id)) {
                ids.add(id);
            }
        });
        return labelValueDao.listByIds(ids);
    }

    @Override
    public ServiceResult<List<LabelValueDTO>> listLabelValues(ListLabelValuesParam param) {
        List<String> labelIds = param.getIds();
        List<LabelValueDO> labelValues = null;
        if (!CollectionUtil.isEmpty(labelIds)) {
            // 有标签值id 只获取指定标签值id的数据
            labelValues = labelValueDao.listByOrgIdAndAttributeAndIds(param.getOrgId(), param.getAttribute(), labelIds);
        } else {
            // 没有标签值id 获取该组织下 指定联系人类型的所有标签值
            labelValues = labelValueDao.listByOrgIdAndMemberType(param.getOrgId(), param.getAttribute());
        }

        List<LabelValueDTO> labelValueDTOS = new ArrayList<>();
        if (CollectionUtil.isNotEmpty(labelValues)) {
            labelValues.forEach(labelValue -> {
                LabelValueDTO dto = LabelValueDTO.convert(labelValue);
                labelValueDTOS.add(dto);
            });
        }

        return ServiceResult.success(labelValueDTOS);
    }

    @Override
    public Boolean batchUpdate(List<LabelValueDO> updateValues) {
        return labelValueDao.batchUpdateLabelValue(updateValues);
    }

    @Override
    public Boolean deleteByIds(List<String> ids) {
        return labelValueDao.deleteByIds(ids);
    }

    @Override
    public Integer countByLabelId(String labelId) {
        return labelValueDao.countByLabelId(labelId);
    }

    @Override
    public Boolean update(UpdateLabelParam param, String labelGroupName, String labelName) {
        LabelValueDO labelValueDO = new LabelValueDO();
        labelValueDO.setLabelId(param.getId());
        labelValueDO.setOrgId(param.getOrgId());
        labelValueDO.setLabelName(param.getName());
        labelValueDO.setLabelGroupId(param.getLabelGroupId());
        labelValueDO.setLabelGroupName(labelGroupName);
        labelValueDO.setManual(param.getManual() ? 1 : 0);
        labelValueDO.setAuto(param.getAuto() ? 1 : 0);
        labelValueDO.setUpdateTime(DateUtil.getCommonDate());
        return labelValueDao.updateLabelInfo(labelValueDO);
    }

    @Override
    public List<LabelValueDO> findByLabelId(String id) {
        return labelValueDao.listByLabelId(id);
    }

    @Override
    public List<LabelValueDO> findValueByLabelId(String id) {
        return labelValueDao.listByLabelId(id);
    }

    @Override
    public Integer countByOrgIdAndLabelId(String orgId, String labelId) {
        return labelValueDao.countByOrgIdAndLabelId(orgId, labelId);
    }

    @Override
    public void deleteByOrgIdAndLabelId(String orgId, String labelId) {
        labelValueDao.deleteByOrgIdAndLabelId(orgId, labelId);
    }
}
